﻿#include <iostream>
#include <fstream>
#include <string>
#include <regex>
#include <vector>

std::vector<std::string> findFunctionNamesInCFile(const std::string& filename) {
	std::vector<std::string> functionNames;
	std::ifstream file(filename);

	if (!file.is_open()) {
		std::cerr << "Unable to open the file: " << filename << std::endl;
		return functionNames;
	}

	std::string currentLine;  //用于记录逐行读取的结果
	std::string totalLine = ""; // 用于记录多行合并的文本
	//std::regex functionRegex(R"([a-zA-Z_]\w*(?=\s*\(\s*.*\s*\)))");// 正则表达式确定函数名称的形式
	int count = 0; // 用于记录总的括号计数
	int countInside = 0; // 用于记录函数内部的括号总数
	while (std::getline(file, currentLine)) {

		//匹配用
		std::smatch match;

		// 去掉前导空格和尾随空格
		currentLine = std::regex_replace(currentLine, std::regex("^\\s+|\\s+$"), "");
		
		//每位都做处理
		for (char c : currentLine) {
			if (count == 0) {
				if (c == '{') {
					//查找最后一个()，即满足条件的离{最近的才是函数名
					size_t lastPos = totalLine.rfind('(');
					if (lastPos != std::string::npos) {
						// 在字符串中找到了最后一个 {
						size_t lastSpacePos = totalLine.rfind(' ', lastPos); // 从 { 位置向前查找最后一个空白字符
						if (lastSpacePos != std::string::npos) {
							std::string contentBeforeBrace = totalLine.substr(lastSpacePos + 1, lastPos - lastSpacePos - 1);
							functionNames.push_back(contentBeforeBrace);
						}
						else {
							std::cout << "No space character found before the {." << std::endl;
						}
					}
					else {
						// 未找到 {
						std::cout << "No ( found in the string." << std::endl;
					}

					//清空totalLine并Count自加
					totalLine = "";
					count++;
				}
				else {
					//继续存c
					totalLine += c;
				}
			}
			else {
				if (c == '}') {
					if (countInside == 0) {
						count--;
					}
					else {
						countInside--;
					}
				}

				if (c == '{') {
					countInside++;
				}
			}
		}	
	}

	file.close();
	return functionNames;
}

int main() {
	std::string filename = "E://aqjgz//ww.c"; 

	//查找C文件的具体实现
	std::vector<std::string> functions = findFunctionNamesInCFile(filename);

	if (functions.empty()) {
		std::cout << "文件中没有函数." << std::endl;
	}
	else {
		std::cout << "该C文件中包含的函数有:" << std::endl;
		for (const std::string& functionName : functions) {
			std::cout << functionName << std::endl;
		}
	}
	return 0;
}
